iconbrowser: Make image dnd work again
authorMatthias Clasen <mclasen@redhat.com>
Fri, 5 Feb 2021 01:46:51 +0000 (20:46 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 5 Feb 2021 01:47:19 +0000 (20:47 -0500)
We need to drag a texture, not a paintable.

Fixes: #3648
demos/icon-browser/iconbrowserwin.c

index 876c09a0d1a2ad36fa88f37c32fc675d5d4169d9..11c9c53234119c092028492aca9483cbfc4c8e8d 100644 (file)
@@ -279,11 +279,31 @@ drag_prepare_texture (GtkDragSource *source,
                       GtkWidget     *widget)
 {
   GdkPaintable *paintable = get_image_paintable (GTK_IMAGE (widget));
+  GtkSnapshot *snapshot;
+  double width, height;
+  GskRenderNode *node;
+  GskRenderer *renderer;
+  GdkTexture *texture;
+  GdkContentProvider *ret;
 
   if (!GDK_IS_PAINTABLE (paintable))
     return NULL;
 
-  return gdk_content_provider_new_typed (GDK_TYPE_PAINTABLE, paintable);
+  snapshot = gtk_snapshot_new ();
+  width = gdk_paintable_get_intrinsic_width (paintable);
+  height = gdk_paintable_get_intrinsic_height (paintable);
+  gdk_paintable_snapshot (paintable, snapshot, width, height);
+  node = gtk_snapshot_free_to_node (snapshot);
+
+  renderer = gtk_native_get_renderer (gtk_widget_get_native (widget));
+  texture = gsk_renderer_render_texture (renderer, node, &GRAPHENE_RECT_INIT (0, 0, width, height));
+
+  ret = gdk_content_provider_new_typed (GDK_TYPE_TEXTURE, texture);
+
+  g_object_unref (texture);
+  gsk_render_node_unref (node);
+
+  return ret;
 }
 
 static GdkContentProvider *